package br.com.cast.scc.dao;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import javax.persistence.Query;

import org.springframework.stereotype.Component;

import br.com.cast.scc.model.DominioTipoVeiculo;
import br.com.cast.scc.model.Veiculo;
import br.com.cast.scc.pages.filtros.FiltroPesquisaVeiculos;

@Component
public class VeiculoDAO extends DAOBase<Veiculo> {

	public Iterator<? extends Veiculo> consultaPaginada(long inicio,
			long total, FiltroPesquisaVeiculos filtro) {
		
		Map<String, Object> parametros = new HashMap<>();
		
		StringBuilder hql = criaQueryConsultaPaginada(filtro, parametros);
		
		Query query = getEntityManager().createQuery(hql.toString());
		
		for (String parametro : parametros.keySet()) {
			query.setParameter(parametro, parametros.get(parametro));
		}
		
		query.setFirstResult((int) inicio);
		query.setMaxResults((int)total);
		
		return query.getResultList().iterator();
	}

	private StringBuilder criaQueryConsultaPaginada(
			FiltroPesquisaVeiculos filtro, Map<String, Object> parametros) {
		
			StringBuilder hql = new StringBuilder();
			
			hql.append("select v ")
			   .append("from Veiculo v ")
			   .append(" join v.tpVeiculo t ")
			   .append(" where 1=1 ");
			
			if(filtro.getTipoVeiculo() != null){
				hql.append(" and t.codigo = :tpVeiculo ");
				parametros.put("tpVeiculo", filtro.getTipoVeiculo().getCodigo());
			}
			
			if(filtro.getStatus() != null){
				hql.append(" and v.status = :status ");
				parametros.put("status", filtro.getStatus().getSituacao());
			}
			
			if (isTipoTerrestreSelecionado(filtro)){
				if(!UtilString.isStringVazia(filtro.getRntrc)){
					
				}
			}
		return null;
	}

	private boolean isTipoTerrestreSelecionado(FiltroPesquisaVeiculos filtro) {
		return filtro.getTipoVeiculo() != null
				&& filtro.getTipoVeiculo().getCodigo().equals(
						DominioTipoVeiculo.COD_TERRESTRE);
	}

}
